#ifndef VIDEORECORDER_FFMPEG_H
#define VIDEORECORDER_FFMPEG_H

extern "C" {
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavutil/imgutils.h>
#include <libavutil/opt.h>
#include <libswscale/swscale.h>
}

#include <QObject>

#include "baserecorder.h"

/**
 * @brief 编码器使用ffmpeg
 * 
 */
class VideoRecorder_ffmpeg : public BaseRecorder {
  Q_OBJECT
 public:
  explicit VideoRecorder_ffmpeg(QObject *parent = nullptr);

  bool init() override;

  bool openFile(const QString &basename) override;

 public slots:
  void onImage(std::shared_ptr<QImage> img) override;

 private:
  // 初始化编码器
  bool init_encode();

  // 初始化文件
  bool init_file();

  bool writeHeader();

  bool encode();

  bool writeFile();

  // QImage转换成yuv
  bool image2Yuv420(std::shared_ptr<QImage> img);
 signals:

 private:
  const AVCodec *m_pCodec{nullptr};
  AVFormatContext *m_pFormatCtx{nullptr};
  AVCodecContext *m_pCodecCtx{nullptr};
  AVFrame *m_pFrame{nullptr};
  AVPacket *m_pPacket{nullptr};
  SwsContext *m_pConvert{nullptr};
  AVStream *m_pStream{nullptr};

  // 是否已经初始化
  bool m_bInited{false};

  // pts 计数
  qint64 m_iPts = {1};

  // 标志量
  bool m_bFirstFrame;

  // 使用h264编码器
  AVCodecID m_codecId{AV_CODEC_ID_H264};

  // frame 数据格式RGB888
  AVPixelFormat m_pixFmt = AV_PIX_FMT_RGB24;

  QString m_sVideoBaseName;
};

#endif  // VIDEORECORDER_FFMPEG_H
